package partida.sala;

import java.util.ArrayList;
import java.util.List;

import models.Jogador;

public class Sistema {

	protected List<Sala> salas = new ArrayList<>();
	
	public boolean criarSala(String nomeSala, int qtdMax, Jogador lider){
		
		boolean jaExiste = false;
	       
        //Percorrer a lista de salas para verificar se o nome já existe, se o lider já tem uma sala criada naquele momento e se a
        //quantidade maxima de jogadores está entre o que é pedido.
        for (Sala sala:salas) {
            if (sala.nome.equals(nomeSala) || sala.lider == lider || qtdMax < 1 || qtdMax > 4){
                jaExiste = true;
                break;
            }
        }
       
        //Se não existe, ele cria a sala e adiciona ela na lista de salas.
        if (!jaExiste) {
            Sala s = new Sala(nomeSala, qtdMax, lider);
           
            salas.add(s);
            return true;
        }
        
        return false;
	}
	
	public List<Sala> verSala(){
		
		return salas;
		
	}
	
	public boolean entrarSala(String nomeSala, Jogador jogador){
		
		if(jogadorEmSala(jogador) == false){
			Sala sala = buscarSala(nomeSala);
			if (sala != null) {
				return sala.addJogador(jogador);
			}
		}
		return false;
		
	}
	
	protected boolean jogadorEmSala(Jogador jogador) {
		for(Sala s: salas){
			for (Jogador j: s.jogadores){
				if(j.email.equals(jogador.email)){
					return true;
				}
			}
		}
		
		return false;
	}
	
	public Sala buscarSala(String nome){
		for(Sala s: salas){
			if(s.nome.equals(nome)){
				return s;
			}
		}
		return null;
	}
	
	public boolean sairSala(Jogador jogador) {
		
		Sala sala = buscarSalaDoJogador(jogador);
		if (sala != null) {
			try {
				sala.removerJogador(jogador);
			} catch (SalaFicouVaziaException e) {
				fecharSala(sala);
				e.printStackTrace();
			}
			return true;
		}
		return false;
	}
	
	protected Sala buscarSalaDoJogador(Jogador jogador) {
		for (Sala sala: salas) {
			for (Jogador j: sala.jogadores) {
				if (j.email.equals(jogador.email)) {
					return sala;
				}
			}
		}
		return null;
	}
	
	private void fecharSala(Sala sala) {
		salas.remove(sala);
	}
}
